package com.zxq.dlt645.analy;

import com.zxq.dlt645.enums.EFrameCmd;
import com.zxq.dlt645.enums.EFrameType;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class AnalyseControlCode {


    /**
     * 分析指令
     * @param code 控制码
     * @return
     */
    public static EFrameCmd analyseCmd(byte code) {
         EFrameCmd eFrameCmd = EFrameCmd.Unknown;
         byte value = (byte) (code & 0x1f);
         eFrameCmd = EFrameCmd.getType(value);
         return eFrameCmd;
    }

    /**
     * 分析帧的类型
     * @param code 控制码
     * @return
     */
    public static EFrameType analyseType(byte code) {
        EFrameType eFrameType = EFrameType.Unknown;
        byte value = (byte) (code & 0xE0) ;
        //System.out.println("value code:" + value);
        if(value >= 0) {
            value = (byte) (value / 32);
            //主站应答帧
            switch (value) {
                case 0:
                    eFrameType = EFrameType.masterNoFollowUp;
                    break;
                case 1:
                    eFrameType = EFrameType.masterHaveFollowUp;
                    break;
            }

        } else {
           //从站应答帧
            value = (byte) ((value + 128) / 32);
            switch (value) {
                case (byte) 0:
                    eFrameType = EFrameType.slaveNoFollowUp;
                 break;
                case (byte) 1:
                    eFrameType = EFrameType.slaveHaveFollowUp;
                    break;
                case (byte) 2:
                    eFrameType = EFrameType.slaveError;
                    break;
            }
        }
        return eFrameType;
    }

    /**
     * 生成控制码
     * @param cmd 指令
     * @param type 帧的类型
     * @return
     */
    public static byte generateCode(EFrameCmd cmd,EFrameType type) {
        byte code = 0;
        byte cmdValue = (byte) cmd.getValue();
        byte typeValue = 0;
        switch (type){
            case masterNoFollowUp: {
                typeValue = 0x00;
            }
                break;
            case masterHaveFollowUp:{
                typeValue = 0x20;
            }
                break;
            case slaveNoFollowUp:{
                typeValue = -128;
            }
                break;
            case slaveHaveFollowUp:{
                typeValue = -128 + 0x20;
            }
                break;
            case slaveError:{
                typeValue = -128 + 0x40;
            }
                break;
        }
        System.out.println("cmdValue:" + cmdValue);
        System.out.println("typeValue:" + typeValue);
        code = (byte) (cmdValue + typeValue);
        return code;
    }

    public static void main(String[] args) {
        byte code = (byte) 0x32;
        System.out.println("src:" + code);
        EFrameType eFrameType = analyseType(code);
        EFrameCmd eFrameCmd = analyseCmd(code);
        System.out.println(eFrameCmd);
        System.out.println(eFrameType);
        code = generateCode(eFrameCmd,eFrameType);
        System.out.println(code);
    }




}
